package com.lei.springbootpractice.config;

import com.lei.springbootpractice.pojo.CategoryPojo;
import com.lei.springbootpractice.service.CategoryService;
import com.lei.springbootpractice.service.ProductsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;

import java.util.List;
import java.util.Map;

/**
 * 缓存预热配置
 * 在应用启动时预加载热点数据以提升性能
 */
@Configuration
@Order(1) // 确保在其他组件之前执行
public class CacheWarmupConfig implements CommandLineRunner {

    @Autowired
    private CategoryService categoryService;

    @Autowired
    private ProductsService productsService;

    @Override
    public void run(String... args) throws Exception {
        System.out.println("=== 开始应用缓存预热 ===");
        
        try {
            // 预热分类缓存
            warmupCategoryCache();
            
            // 预热商品缓存
            warmupProductCache();
            
            System.out.println("=== 应用缓存预热完成 ===");
        } catch (Exception e) {
            System.err.println("缓存预热失败：" + e.getMessage());
            e.printStackTrace();
        }
    }

    /**
     * 预热分类缓存
     */
    private void warmupCategoryCache() {
        System.out.println("=== 启动时预热分类缓存 ===");
        
        // 强制清除缓存并重新加载
        categoryService.clearCache();
        System.out.println("已清除分类缓存");
        
        // 预加载父分类
        List<CategoryPojo> parentCategories = categoryService.getParentCategories();
        System.out.println("预加载父分类数量: " + parentCategories.size());
        
        // 预加载分类层级结构
        Map<String, List<CategoryPojo>> hierarchy = categoryService.getCategoryHierarchy();
        System.out.println("预加载分类层级数量: " + hierarchy.size());
        
        // 强制预热
        categoryService.warmUpCache();
        
        System.out.println("=== 分类缓存预热完成 ===");
    }

    /**
     * 预热商品缓存
     */
    private void warmupProductCache() {
        System.out.println("预热商品缓存...");
        
        try {
            // 预加载所有商品（用于填充分类信息）
            productsService.getAllProducts();
            
            System.out.println("商品缓存预热完成");
        } catch (Exception e) {
            System.err.println("商品缓存预热失败：" + e.getMessage());
        }
    }
} 